<?php

/**
 * This is the model class for table "{{comment}}".
 *
 * The followings are the available columns in table '{{comment}}':
 * @property integer $id
 * @property string $content
 * @property integer $status
 * @property integer $create_time
 * @property string $author
 * @property string $email
 * @property string $url
 * @property integer $post_id
 *
 * The followings are the available model relations:
 * @property Post $post
 */
class Comment extends CActiveRecord
{

  const STATUS_PENDING=1;
  const STATUS_APPROVED=2;

  /**
   * Returns the static model of the specified AR class.
   * @param string $className active record class name.
   * @return Comment the static model class
   */
  public static function model($className=__CLASS__)
  {
    return parent::model($className);
  }

  /**
   * @return string the associated database table name
   */
  public function tableName()
  {
    return '{{comment}}';
  }

  //viennp
  public function approve()
  {
    $this->status=Comment::STATUS_APPROVED;
    $this->update(array('status'));
  }


  /** viennp
   * @param Post the post that this comment belongs to. If null, the method
   * will query for the post.
   * @return string the permalink URL for this comment
   */
  public function getUrl($post=null)
  {
    if($post===null)
      $post=$this->post;
    return $post->url.'#c'.$this->id;
  }


  /**
   * @return string the hyperlink display for the current comment's author
   */
  public function getAuthorLink()
  {
    if(!empty($this->url))
      return CHtml::link(CHtml::encode($this->author),$this->url);
    else
      return CHtml::encode($this->author);
  }

  /**
   * @return integer the number of comments that are pending approval
   */
  public function getPendingCommentCount()
  {
    return $this->count('status='.self::STATUS_PENDING);
  }

  /**
   * @param integer the maximum number of comments that should be returned
   * @return array the most recently added comments
   */
  public function findRecentComments($limit=10)
  {
    return $this->with('post')->findAll(array(
        'condition'=>'t.status='.self::STATUS_APPROVED,
        'order'=>'t.create_time DESC',
        'limit'=>$limit,
    ));
  }


  // viennp add before save
  protected function beforeSave()
  {
    if(parent::beforeSave())
    {
      if($this->isNewRecord)
        $this->create_time=time();
      return true;
    }
    else
      return false;
  }

  /**
   * @return array validation rules for model attributes.
   */
  public function rules()
  {
    // NOTE: you should only define rules for those attributes that
    // will receive user inputs.
    /* return array(
        array('content, status, author, email, post_id', 'required'),
        array('status, create_time, post_id', 'numerical', 'integerOnly'=>true),
        array('author, email, url', 'length', 'max'=>128),
        // The following rule is used by search().
        // Please remove those attributes that should not be searched.
        array('id, content, status, create_time, author, email, url, post_id', 'safe', 'on'=>'search'),
    ); */
    // viennp
    return array(
        array('content, author, email', 'required'),
        array('author, email, url', 'length', 'max'=>128),
        array('email','email'),
        array('url','url'),
    );
  }


  /**
   * @return array relational rules.
   */
  public function relations()
  {
    // NOTE: you may need to adjust the relation name and the related
    // class name for the relations automatically generated below.
    return array(
        'post' => array(self::BELONGS_TO, 'Post', 'post_id'),
    );
  }

  /**
   * @return array customized attribute labels (name=>label)
   */
  public function attributeLabels()
  {
    // label hien thi trong form them du lieu
    return array(
        'id' => 'Id',
        'content' => 'Comment',
        'status' => 'Status',
        'create_time' => 'Create Time',
        'author' => 'Name',
        'email' => 'Email',
        'url' => 'Website',
        'post_id' => 'Post',
    );
  }

  /**
   * Retrieves a list of models based on the current search/filter conditions.
   * @return CActiveDataProvider the data provider that can return the models based on the search/filter conditions.
   */
  public function search()
  {
    // Warning: Please modify the following code to remove attributes that
    // should not be searched.

    $criteria=new CDbCriteria;

    $criteria->compare('id',$this->id);
    $criteria->compare('content',$this->content,true);
    $criteria->compare('status',$this->status);
    $criteria->compare('create_time',$this->create_time);
    $criteria->compare('author',$this->author,true);
    $criteria->compare('email',$this->email,true);
    $criteria->compare('url',$this->url,true);
    $criteria->compare('post_id',$this->post_id);

    return new CActiveDataProvider($this, array(
        'criteria'=>$criteria,
    ));
  }
}